/**
*  请求模块
*/
import axios from 'axios'
// 导入vuex 如果是用到仓库的数据 导入vuex  如果js文件中导入  需要@/store导入整个文件
import store from '@/store'
// 导入bigint第三方包
import jsonBig from 'json-bigint'
// import { config } from 'vue/types/umd'

const request = axios.create({
  baseURL: 'http://ttapi.research.itcast.cn/', // 基础路径
  // transformResponse 允许自定义原始的响应数据（字符串）
  transformResponse: [function (data) {
    try {
      // 如果转换成功则返回转换的数据结果
      return jsonBig.parse(data)
    } catch (err) {
      // 如果转换失败，则包装为统一数据格式并返回
      return {
        data
      }
    }
  }]
})

// 请求拦截器
request.interceptors.request.use(function (config) {
  // Do something before request is sent
  const { user } = store.state
  if (user && user.token) {
    config.headers.Authorization = `Bearer ${user.token}`
  }
  return config
}, function (error) {
  // Do something with request error
  return Promise.reject(error)
})

// 响应拦截器
request.interceptors.response.use(config => {
  return config
}, async err => {
  // 捕获错误信息
  console.dir(err)
  // 如果响应错误数据并且状态码是401
  if (err.response && err.response.status === 401) {
    // 从仓库中获取用户信息
    const { user } = store.state
    console.log(user.refresh_token)
    // 如果用户信息和令牌都有
    if (user && user.refresh_token) {
      // 发送请求刷新用户token 因为request已经设置了请求拦截器添加了请求头 所以这里不能用 需要用axios重新配置请求头和请求路径
      const ret = await axios({
        method: 'PUT',
        url: 'http://ttapi.research.itcast.cn/app/v1_0/authorizations',
        headers: {
          Authorization: 'Bearer ' + user.refresh_token
        }
      })
      // 把返回的新token更新到仓库中
      const newToken = ret.data.data.token
      console.log(newToken)
      store.commit('setUser', {
        token: newToken,
        refresh_token: user.refresh_token
      })
      // 发送请求刷新页面  提高用户体验
      return request(err.config)
    }
  }
})
export default request
